使用lvs(linux virtual serevr)做负载均衡

使用lvs(linux virtual serevr)做负载均衡

负载均衡:指对系统中的负载情况进行动态调整,以尽量消除或减少系统中各节点负载不均衡的现象。从而提高系统的吞吐量。

1
2
调度器:srever1.example.com
Real server: server2.example.com server3.example.com

调度器端的操作(server1)

安装软件

[root@server1 ha.d]# yum install ipvsadm -y

查看已经存在的规则:

1
2
3
4
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

若有规则,则用下面的命令清除:
[root@server1 ~]# ipvsadm -C

添加一个浮动的IP

1
2
3
4
5
6
7
8
9
10
[root@server1 ~]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts]# cp ifcfg-eth1 ifcfg-eth1:1
[root@server1 network-scripts]# cat ifcfg-eth1:1
DEVICE="eth1:1"
BOOTPROTO="none"
ONBOOT="yes"
IPADDR=172.25.9.100
PREFIX=24
GATEWAY=172.25.9.250
[root@server1 network-scripts]# /etc/init.d/network restart

给ipvsadm添加规则

添加浮动IP和RS:

1
2
3
[root@server1 ~]# ipvsadm -A -t 172.25.9.100:80 -s rr			#浮动IP
[root@server1 ~]# ipvsadm -a -t 172.25.9.100:80 -r 172.25.9.2:80 -g #给浮动IP添加real server
[root@server1 ~]# ipvsadm -a -t 172.25.9.100:80 -r 172.25.9.3:80 -g #给浮动IP添加real server

查看规则:

1
2
3
4
5
6
7
8
[root@server1 ~]# ipvsadm -l
[root@server1 ~]# ipvsadm -ln #只查看,不解析
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.9.100:80 rr
-> 172.25.9.2:80 Route 1 0 0
-> 172.25.9.3:80 Route 1 0 0

保存规则:

1
2
[root@server1 ~]# /etc/init.d/ipvsadm save		#保存规则
[root@server1 ~]# /etc/init.d/ipvsadm restart #重启服务

RS端的操作(server2和server3)

安装软件

1
2
3
4
5
6
7
8
9
10
[root@server2 ~]# yum install arptables_jf -y	
[root@server2 ~]# arptables -L #现在还没有任何规则
Chain IN (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro

Chain OUT (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro

Chain FORWARD (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro

添加浮动IP

1
2
3
4
5
6
7
8
[root@server2 network-scripts]# cat ifcfg-eth1:1
DEVICE="eth1:1"
BOOTPROTO="none"
ONBOOT="yes"
IPADDR=172.25.9.100
PREFIX=24
GATEWAY=172.25.9.250
[root@server2 ~]# ifconfig eth1:1 172.25.9.100 netmask 255.255.255.0 up

添加ARP规则

1
2
3
4
[root@server2 ~]# arptables -A IN -d 172.25.9.100 -j DROP
[root@server2 ~]# arptables -A OUT -s 172.25.9.100 -j mangle --mangle-ip-s 172.25.9.2
[root@server2 ~]# /etc/init.d/arptables_jf save
[root@server2 ~]# chkconfig arptables_jf on

实验结果

我们用httpd服务做一下简单测试吧!
开启RS端的httpd服务
浏览器访问浮动IP,因为我们使用的调度规则是RR,轮叫机制,所以每在页面刷新一次,出来的就不同

【补充】:
另外一种做法,比第一种简单

调度端(server1)的操作

下载ipvsadm(同上)

加载rule

1
2
3
4
[root@server1 ~]# ipvsadm -C		#清空ipvs转发表
[root@server1 ~]# ipvsadm -A -t 172.25.9.100:80 -s rr #-A:添加一个虚拟IP-ttcp服务,-s:指定调度算法
[root@server1 ~]# ipvsadm -a -t 172.25.9.100:80 -r 172.25.9.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.9.100:80 -r 172.25.9.3:80 -g

保存rule

1
[root@server1 ~]# service ipvsadm save

绑定vip

1
ifconfig eth1:0 172.25.9.100 netmask 255.255.255.255 up

RS端(server2&server3)

1
[root@server2 ~]# vi /etc/sysctl.conf

加入两行:

1
2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

1
2
[root@server2 ~]# sysctl -p
[root@server2 ~]# ifconfig lo:0 172.25.9.100 netmask 255.255.255.255

测试

测试效果与第一种效果相同
也可以使用命令测试:

1
2
3
4
5
6
[root@foundation187 ~]# links -dump 172.25.9.100
hello server2
[root@foundation187 ~]# links -dump 172.25.9.100
hello server3
[root@foundation187 ~]# links -dump 172.25.9.100
hello server2

进一步分析一下:
我的浏览器在物理机上,我看到arp解析到的是调度端server1的MAC地址

1
2
[root@foundation187 ~]# arp -an | grep 172.25.9.100
? (172.25.9.100) at 52:54:00:9a:d3:95 [ether] on br0